#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

typedef enum { false, true } bool;
typedef int ElemSet; /* 默认矩阵元素为整型 */
typedef struct MatrixNode *Matrix;
struct MatrixNode {
    ElemSet **t;
    int row;
    int col;
};
#define kMaxS 4 /* 解分量的值域规模|S|的上限 */

ElemSet **Create2DArray(int row, int col) {
    /* 动态声明row行col列的二维数组 */
    ElemSet *a, **t;
    int i;

    a = (ElemSet *)malloc(sizeof(ElemSet) * row * col);
    t = (ElemSet **)malloc(sizeof(ElemSet *) * row);
    for (i = 0; i < row; i++)
        t[i] = &a[col * i];
    return t;
}

void Free2DArray(ElemSet **t) {
    /* 释放二维数组空间 */
    free(t[0]);
    free(t);
}

bool Check(int s[], Matrix T) {
    /* 仍然按分书问题的2个约束进行检查 */
    int n, i, j;
    bool ret;

    ret = true; /* 初始化返回值 */
    n = T->row; /* 解的分量数等于关系矩阵的行数 */
    for (i = 0; i < n; i++) { /* 检查每个解分量 */
        for (j = i + 1; j < n; j++) {
            if (s[i] == s[j]) {
                ret = false; /* 不满足约束（1） */
                break;
            }
        }
        if (T->t[i][s[i] - 1] == 0) {
            ret = false; /* 不满足约束（2） */
        }
        if (ret == false) {
            break;
        }
    }
    return ret;
}

void Print(int *s, int n) {
    /* 输出一组解 */
    int i;

    printf("(%d", s[0]);
    for (i = 1; i < n; i++) {
        printf(", %d", s[i]);
    }
    printf(")\n");
}

/* 算法15-2：枚举法的嵌套循环实现 IterBruteForce(T) */
void IterBruteForce(Matrix T) {
    /* 以下代码仅为示范模板 */
    int *s; /* 解的状态分量 */
    int *S; /* 解分量的值域规模 */
    int n, i;

    n = T->row; /* 解的分量数等于关系矩阵的行数 */
    s = (int *)malloc(sizeof(int) * n);
    S = (int *)malloc(sizeof(int) * n);
    /* 这里假设所有解分量的值域规模都是kMaxS */
    for (i = 0; i < n; i++) {
        S[i] = kMaxS;
    }
    /* 以下循环求解 */
    for (s[0] = 1; s[0] <= S[0]; s[0]++) {
        for (s[1] = 1; s[1] <= S[1]; s[1]++) {
            /* 如果n大于3，则这里还有更多层嵌套 */
            for (s[n - 1] = 1; s[n - 1] <= S[n - 1]; s[n - 1]++) {
                if (Check(s, T) == true) {
                    Print(s, n);
                }
            }
        }
    }
}
/* 算法15-2 结束 */

int main(void) {
    Matrix T;
    int n_people, n_book, i, j;

    scanf("%d %d", &n_people, &n_book);
    T = (Matrix)malloc(sizeof(struct MatrixNode));
    T->row = n_people;
    T->col = n_book;
    T->t = Create2DArray(T->row, T->col);
    for (i = 0; i < n_people; i++) {
        for (j = 0; j < n_book; j++) {
            scanf("%d", &T->t[i][j]);
        }
    }
    IterBruteForce(T);
    Free2DArray(T->t);
    free(T);

    return 0;
}